package com.zp.pattern.dynamicProxy;

import java.lang.reflect.InvocationHandler;
import java.lang.reflect.Method;

/**
 * 该代理类的内部属性是Object类型，实际使用的时候通过该类的构造方法传递进来一个对象
 * 此外，该类还实现了invoke方法，该方法中的method.invoke其实就是调用被代理对象的将要
 * 执行的方法，方法参数是sub，表示该方法从属于sub，通过动态代理类，我们可以在执行真实对象的方法前后
 * 加入自己的一些额外方法。
 */

public class DynamicProxy implements InvocationHandler {
	
	//真实类型的引用，此处接收的是realSubject，
	private Object sub;
	
	public DynamicProxy(Object obj){
		this.sub = obj;
	}

	@Override
	/**
	 * invoke()方法中的参数都是可以直接使用的：
	 * Object proxy：代理实例的引用；
	 * Method method：代理中要执行方法的Method对象，也就是request()方法(Client类中的subject.request());
	 * Object[] args：method方法中的request()方法中的参数，该方法没有参数；
	 */
	public Object invoke(Object proxy, Method method, Object[] args)
			throws Throwable {
		
		System.out.println("befor===="+method);
		
		//用反射来调用传入实例的方法：在这相当于RealSubject调用request方法；
		method.invoke(sub,args);
		
		System.out.println("after===="+method);
		
		return null;
	}

}
